ITBA
Especialización en Ciencia de Datos
Materia: Visualización de la información
Alumnos:
En este proyecto intentaremos visualizar el estado de la conectividad de internet en países de América Latina y el Caribe, documentar la heterogeneidad y la relación con otras brechas de infraestructura. Para ello, tomamos datos provenientes de OOKLA para 2023, que realizan una recolección de las pruebas de velocidad de los dispositivos y las publican en su portal de forma agregada por trimestre, para grids de 600 metros x 600 metros. Estos datos los enriquecemos con datos de población y de brechas de infraestructura proveniente de los censos poblacionales de cada país.
#Instalamos librerías
!pip install altair -U
!pip install vegafusion
!pip install "vegafusion[embed]>=1.5.0"
!pip install vegafusion vegafusion-python-embed
!pip install --upgrade altair
!pip install geopandas pandas
!pip install duckdb
Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (4.2.2) Collecting altair Downloading altair-5.4.1-py3-none-any.whl.metadata (9.4 kB) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0) Collecting narwhals>=1.5.2 (from altair) Downloading narwhals-1.12.1-py3-none-any.whl.metadata (7.2 kB) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2) Downloading altair-5.4.1-py3-none-any.whl (658 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 658.1/658.1 kB 8.2 MB/s eta 0:00:00 Downloading narwhals-1.12.1-py3-none-any.whl (195 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 195.1/195.1 kB 8.8 MB/s eta 0:00:00 Installing collected packages: narwhals, altair Attempting uninstall: altair Found existing installation: altair 4.2.2 Uninstalling altair-4.2.2: Successfully uninstalled altair-4.2.2 Successfully installed altair-5.4.1 narwhals-1.12.1 Collecting vegafusion Downloading vegafusion-1.6.9-py3-none-any.whl.metadata (1.3 kB) Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.4.1) Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2) Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5) Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.23.0) Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (1.12.1) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.12.2) Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.20.0) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion) (3.0.2) Downloading vegafusion-1.6.9-py3-none-any.whl (54 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 54.5/54.5 kB 1.9 MB/s eta 0:00:00 Installing collected packages: vegafusion Successfully installed vegafusion-1.6.9 Requirement already satisfied: vegafusion>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion[embed]>=1.5.0) (1.6.9) Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (5.4.1) Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (16.1.0) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2.2.2) Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (5.9.5) Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.20.3) Collecting vegafusion-python-embed==1.6.9 (from vegafusion[embed]>=1.5.0) Downloading vegafusion_python_embed-1.6.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (394 bytes) Collecting vl-convert-python>=0.7.0 (from vegafusion[embed]>=1.5.0) Downloading vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.2 kB) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (4.23.0) Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.12.1) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (4.12.2) Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.26.4) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.2) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (0.20.0) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.16.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.0.2) Downloading vegafusion_python_embed-1.6.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.1/25.1 MB 47.2 MB/s eta 0:00:00 Downloading vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 30.1/30.1 MB 19.8 MB/s eta 0:00:00 Installing collected packages: vegafusion-python-embed, vl-convert-python Successfully installed vegafusion-python-embed-1.6.9 vl-convert-python-1.7.0 Requirement already satisfied: vegafusion in /usr/local/lib/python3.10/dist-packages (1.6.9) Requirement already satisfied: vegafusion-python-embed in /usr/local/lib/python3.10/dist-packages (1.6.9) Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.4.1) Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2) Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5) Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.23.0) Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (1.12.1) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.12.2) Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.20.0) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion) (3.0.2) Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (5.4.1) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0) Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair) (1.12.1) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2) Requirement already satisfied: geopandas in /usr/local/lib/python3.10/dist-packages (1.0.1) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.2.2) Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from geopandas) (1.26.4) Requirement already satisfied: pyogrio>=0.7.2 in /usr/local/lib/python3.10/dist-packages (from geopandas) (0.10.0) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from geopandas) (24.1) Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.10/dist-packages (from geopandas) (3.7.0) Requirement already satisfied: shapely>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from geopandas) (2.0.6) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2) Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from pyogrio>=0.7.2->geopandas) (2024.8.30) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0) Requirement already satisfied: duckdb in /usr/local/lib/python3.10/dist-packages (1.1.2)
!pip install --upgrade altair vegafusion vegafusion-python-embed
Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (5.4.1) Requirement already satisfied: vegafusion in /usr/local/lib/python3.10/dist-packages (1.6.9) Requirement already satisfied: vegafusion-python-embed in /usr/local/lib/python3.10/dist-packages (1.6.9) Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4) Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0) Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair) (1.12.1) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1) Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2) Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2) Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5) Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3) Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0) Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0)
#Importamos las librerías
import pandas as pd
import altair as alt
import geopandas as gpd
alt.data_transformers.enable("vegafusion")
import warnings
import duckdb
warnings.simplefilter(action='ignore', category=FutureWarning)
import numpy as np
#Creamos una paleta de colores que ciertos gráficos nos permita distinguir de mejor manera nuestras observaciones
palette = [
"#EAB8B1", # Pastel Red
"#F6D7A9", # Pastel Orange
"#E3F6A1", # Pastel Yellow
"#B9E6B3", # Pastel Green
"#A4D7E1", # Pastel Cyan
"#B2C2E6", # Pastel Blue
"#C7A2E2", # Pastel Lavender
"#E2A8D2", # Pastel Magenta
"#F8BBD0", # Pastel Pink
"#FF9C85", # Light Coral
"#FFCCB3", # Light Peach
"#D5E3A0", # Light Lime
"#9ED1B0", # Light Mint
"#7DA1D5", # Light Sky Blue
"#A59FD5", # Light Purple
"#D6B9D9", # Light Orchid
"#F5CBA0", # Light Apricot
"#C7D3D4", # Light Gray
"#F9F6C1", # Light Cream
"#FFB5E8", # Light Blush
"#FF6B6B", # Bright Red
"#FFD700", # Bright Yellow
"#3DDC84", # Bright Green
"#5A9BD5", # Bright Blue
"#B05EB4", # Bright Purple
"#FF85A2", # Bright Pink
"#A7A8D9" # Soft Indigo
]
Sobre el conjunto de datos utilizado:
Como se mencionó en la introducción, en este trabajo utilizamos la base de datos pública de OOKLA para 2023, de donde tomamos los datos sobre velocidad de internet fijo. Estos datos los enriquecemos con datos de población proveniente de los censos poblacionales de cada país y de brechas de infraestructura.
Para documentar la heterogeneidad, aprovechamos la desagregación geográfica de los datos de los censos y tomamos los gobiernos locales (municipios/comunas) como unidad de análisis geográfico (a excepción de Argentina y Uruguay). Para que coincidan las unidades geográficas de análisis, los datos de OOKLA son agregados a nivel de gobierno local, haciendo la intersección de las capas geográficas. El detalle del procesamiento se puede ver en este link o un ejemplo más breve en colab se puede consultar aquí (en esta prueba es probable que arroje el error "sin memoria RAM", por lo que se recomienda correrlo localmente).
#Levantamos el dataset
df = pd.read_csv("https://paulavischic.github.io/ecd2024a/data/ookla_porlevel_2023.csv")
Las variables que utilizaremos son las siguientes:
Variables que identifican la unidad geográfica:
Variables de conectividad de internet:
Variables que caracterizan la unidad geográfica:
#Hacemos una primera visualización de nuestros datos
keep=['COUNTRY', 'NAME_1', 'NAME_2', 'speed_df1', 'speed_uf1', 'poblacion', 'tics_internet', 'agua_mejorada_red', 'electricidad' ]
df=df[keep]
df.head()
| COUNTRY | NAME_1 | NAME_2 | speed_df1 | speed_uf1 | poblacion | tics_internet | agua_mejorada_red | electricidad | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Argentina | Buenos Aires | NaN | 103.450934 | 54.207011 | 15634050.0 | NaN | 0.756510 | 0.997917 |
| 1 | Argentina | Catamarca | NaN | 58.539385 | 31.985785 | 367556.0 | NaN | 0.935111 | 0.976998 |
| 2 | Argentina | Chaco | NaN | 52.419413 | 27.133152 | 1055337.0 | NaN | 0.763009 | 0.939295 |
| 3 | Argentina | Chubut | NaN | 51.833834 | 44.693544 | 509194.0 | NaN | 0.963976 | 0.990512 |
| 4 | Argentina | Ciudad de Buenos Aires | NaN | 150.602219 | 59.033449 | 2892544.0 | NaN | 0.997258 | 0.999503 |
#Obtenemos cuántas variables y registros tiene nuestro set de datos
df.shape
(12428, 9)
#Un primer acercamiento a las medidas descriptivas de cada variable
df.describe()
| speed_df1 | speed_uf1 | poblacion | tics_internet | agua_mejorada_red | electricidad | |
|---|---|---|---|---|---|---|
| count | 11707.000000 | 11707.000000 | 1.222800e+04 | 11698.000000 | 11943.000000 | 11880.000000 |
| mean | 74.211919 | 53.969532 | 4.714948e+04 | 0.178589 | 0.710452 | 0.940924 |
| std | 56.802383 | 48.017819 | 2.481386e+05 | 0.166036 | 0.214059 | 0.119449 |
| min | 0.157000 | 0.160667 | 8.100000e+01 | 0.000000 | 0.000000 | 0.025758 |
| 25% | 27.579885 | 13.668083 | 6.043750e+03 | 0.048774 | 0.585740 | 0.952153 |
| 50% | 60.247463 | 38.751340 | 1.375850e+04 | 0.125928 | 0.757095 | 0.985702 |
| 75% | 109.835778 | 84.878647 | 3.171100e+04 | 0.263659 | 0.880055 | 0.995532 |
| max | 482.627000 | 322.413937 | 1.563405e+07 | 0.936680 | 1.000000 | 1.000000 |
#Obtenemos un nuevo resumen con cantidades, nulos y tipo de datos
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 12428 entries, 0 to 12427 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 COUNTRY 12428 non-null object 1 NAME_1 12153 non-null object 2 NAME_2 12385 non-null object 3 speed_df1 11707 non-null float64 4 speed_uf1 11707 non-null float64 5 poblacion 12228 non-null float64 6 tics_internet 11698 non-null float64 7 agua_mejorada_red 11943 non-null float64 8 electricidad 11880 non-null float64 dtypes: float64(6), object(3) memory usage: 874.0+ KB
#Visualizamos qué países tenemos
df['COUNTRY'].unique()
array(['Argentina', 'Uruguay', 'Mexico', 'República Dominicana',
'Bahamas', 'Chile', 'Colombia', 'Ecuador', 'Guatemala',
'Nicaragua', 'Antigua and Barbuda', 'Jamaica', 'Suriname',
'Trinidad and Tobago', 'Brazil', 'Costa Rica', 'Cuba', 'Honduras',
'Venezuela', 'Bolivia', 'Panama', 'Paraguay', 'Haiti', 'Peru',
'Saint Kitts and Nevis', 'El Salvador'], dtype=object)
#Como así también a nivel Estado/Provincia
df['NAME_1'].unique()
array(['Buenos Aires', 'Catamarca', 'Chaco', 'Chubut',
'Ciudad de Buenos Aires', 'Córdoba', 'Corrientes', 'Entre Ríos',
'Formosa', 'Jujuy', 'La Pampa', 'La Rioja', 'Mendoza', 'Misiones',
'Neuquén', 'Río Negro', 'Salta', 'San Juan', 'San Luis',
'Santa Cruz', 'Santa Fe', 'Santiago del Estero',
'Tierra del Fuego', 'Tucumán', 'Artigas', 'Canelones',
'Cerro Largo', 'Colonia', 'Durazno', 'Flores', 'Florida',
'Lavalleja', 'Maldonado', 'Montevideo', 'Paysandú', 'Rivera',
'Rocha', 'Salto', 'San José', 'Soriano', 'Tacuarembó',
'Treinta y Tres', 'Guerrero', nan, 'Región de Tarapacá',
'Región de Antofagasta', 'Región de Atacama', 'Región de Coquimbo',
'Región de Valparaíso', 'Región del Libertador Bernardo O',
'Región del Maule', 'Región del Bío-Bío', 'Región de La Araucanía',
'Región de Los Lagos', 'Región de Aysén del Gral. Ibañez',
'Región de Magallanes y Antártica',
'Región Metropolitana de Santiago', 'Región de Los Ríos',
'Región de Arica y Parinacota', 'Región de Ñuble', 'Antioquia',
'Norte de Santander', 'Meta', 'Chocó', 'Huila', 'Bolívar',
'Cundinamarca', 'Cesar', 'Santander', 'Caldas', 'Casanare',
'Nariño', 'Caquetá', 'La Guajira', 'Valle del Cauca', 'Magdalena',
'Cauca', 'Boyacá', 'Tolima', 'Risaralda', 'Arauca', 'Quindio',
'Atlántico', 'Guainía', 'Bogotá, D.C.', 'Sucre', 'Guaviare',
'Vaupés', 'Putumayo', 'Vichada', 'Amazonas',
'Archipiélago de San Andrés, Prov', 'Manabi', 'Orellana',
'Chimborazo', 'Guayas', 'Tungurahua', 'Imbabura', 'Pastaza',
'Napo', 'El Oro', 'Esmeraldas', 'Cañar', 'Los Rios', 'Carchi',
'Bolivar', 'Loja', 'Azuay', 'Sucumbios', 'Pichincha',
'Zamora Chinchipe', 'Zona No Delimitada', 'Morona Santiago',
'Galapagos', 'Santa Elena', 'Cotopaxi',
'Santo Domingo de los Tsachilas', 'Chimaltenango', 'Jutiapa',
'Huehuetenango', 'Quetzaltenango', 'Sacatepéquez', 'Guatemala',
'San Marcos', 'Santa Rosa', 'Zacapa', 'Alta Verapaz', 'Chiquimula',
'Quiché', 'Retalhuleu', 'Suchitepéquez', 'Sololá', 'Baja Verapaz',
'Petén', 'Izabal', 'El Progreso', 'Escuintla', 'Jalapa',
'Totonicapán', 'Aguascalientes', 'Baja California',
'Baja California Sur', 'Campeche', 'Coahuila de Zaragoza',
'Colima', 'Chiapas', 'Chihuahua', 'Ciudad de México', 'Durango',
'Guanajuato', 'Hidalgo', 'Jalisco', 'México',
'Michoacán de Ocampo', 'Morelos', 'Nayarit', 'Nuevo León',
'Oaxaca', 'Puebla', 'Querétaro', 'Quintana Roo',
'San Luis PotosÃ\xad', 'Sinaloa', 'Sonora', 'Tabasco',
'Tamaulipas', 'Tlaxcala', 'Veracruz de Ignacio de la Llave',
'Yucatán', 'Zacatecas', 'Managua', 'León', 'Rivas',
'Región Autónoma Costa Caribe Nor', 'Matagalpa', 'Chinandega',
'Carazo', 'Nueva Segovia', 'Río San Juan', 'Madriz', 'Granada',
'Región Autónoma de la Costa Cari', 'Jinotega', 'Masaya', 'Boaco',
'Chontales', 'Estelí', 'Acre', 'Alagoas', 'Amapá', 'Bahia',
'Ceará', 'Espírito Santo', 'Goiás', 'Maranhão', 'Mato Grosso',
'Mato Grosso do Sul', 'Minas Gerais', 'Pará', 'Paraíba', 'Paraná',
'Pernambuco', 'Piauí', 'Rio de Janeiro', 'Rio Grande do Norte',
'Rio Grande do Sul', 'Rondônia', 'Roraima', 'Santa Catarina',
'São Paulo', 'Sergipe', 'Tocantins', 'Alajuela', 'Cartago',
'Guanacaste', 'Heredia', 'Limón', 'Puntarenas', 'Camagüey',
'Ciego de Ávila', 'Cienfuegos', 'Ciudad de la Habana', 'Granma',
'Guantánamo', 'Holguín', 'Isla de la Juventud', 'La Habana',
'Las Tunas', 'Matanzas', 'Mayabeque', 'Pinar del Río',
'Sancti Spíritus', 'Santiago de Cuba', 'Villa Clara', 'Atlántida',
'Choluteca', 'Colón', 'Comayagua', 'Copán', 'Cortés', 'El Paraíso',
'Francisco Morazán', 'Gracias a Dios', 'Intibucá',
'Islas de la Bahía', 'La Paz', 'Lempira', 'Ocotepeque', 'Olancho',
'Santa Bárbara', 'Valle', 'Yoro', 'Anzoátegui', 'Apure', 'Aragua',
'Barinas', 'Carabobo', 'Cojedes', 'Delta Amacuro',
'Distrito Capital', 'Falcón', 'Guárico', 'Lara', 'Mérida',
'Miranda', 'Monagas', 'Nueva Esparta', 'Portuguesa', 'Táchira',
'Trujillo', 'Vargas', 'Yaracuy', 'Zulia', 'Beni', 'Chuquisaca',
'Cochabamba', 'Oruro', 'Pando', 'Potosí', 'Tarija', 'Panamá Oeste',
'Veraguas', 'Panamá', 'Los Santos', 'Darién', 'Chiriquí', 'Coclé',
'Bocas del Toro', 'Herrera', 'Comarca Ngäbe Buglé',
'Comarca Emberá Wounaán', 'ITAPUA', 'SAN PEDRO', 'CAAGUAZU',
'CANINDEYU', 'CORDILLERA', 'GUAIRA', 'BOQUERON', 'AMAMBAY',
'PARAGUARI', 'ALTO PARANA', 'PRESIDENTE HAYES', 'CAAZAPA',
'MISIONES', 'CENTRAL', 'ALTO PARAGUAY', 'CONCEPCION', 'ÑEEMBUCU',
'ASUNCION', "Grande'Anse", 'Nord', 'Nord-Ouest', 'Sud-Est',
'Nippes', 'Ouest', 'Artibonite', 'Sud', 'Centre', 'Nord-Est',
'Apurimac', 'Huancavelica', 'Cusco', 'Ancash', 'Loreto', 'Huanuco',
'Arequipa', 'La Libertad', 'Ucayali', 'Piura', 'Puno', 'Lima',
'San Martin', 'Cajamarca', 'Callao', 'Tacna', 'Ayacucho', 'Junin',
'Lambayeque', 'Ica', 'Tumbes', 'Pasco', 'Moquegua',
'Madre de Dios'], dtype=object)
# Histograma de la variable velocidad de descarga
alt.Chart(df).mark_bar(color='#fdb462').encode(
alt.X("speed_df1:Q", bin= True, title = 'Velocidad de descarga (Mbps)'),
alt.Y('count()', title = 'Total')
).properties(
title='Histograma de velocidad de descarga',
)
El histograma muestra que la mayoría de las conexiones de internet en América Latina y el Caribe tienen velocidades de descarga bajas, concentradas principalmente entre 0 y 50 Mbps. A medida que las velocidades aumentan, la frecuencia de observaciones disminuye drásticamente, y apenas se registran datos a partir de los 250 Mbps. Esto sugiere que la mayoría de los usuarios en la región experimentan bajas velocidades, con pocos casos de acceso a internet de alta velocidad, reflejando una posible desigualdad en la calidad del servicio de internet en la región.
# Graficamos un histograma de velocidad de carga
alt.Chart(df).mark_bar(color='#bc80bd').encode(
alt.X("speed_uf1:Q", bin= True, title = 'Velocidad de carga (Mbps)'),
alt.Y('count()', title = 'Total')
).properties(
title='Histograma de velocidad de carga',
)
El histograma de velocidad de carga en América Latina y el Caribe muestra una concentración significativa en las velocidades bajas, con la mayoría de las observaciones entre 0 y 50 Mbps. A medida que las velocidades de carga aumentan, la frecuencia disminuye rápidamente, y las velocidades superiores a 150 Mbps son muy poco comunes. Esto refleja que la mayoría de los usuarios en la región tienen conexiones con capacidades limitadas de carga, lo que puede impactar negativamente la calidad de las aplicaciones que dependen de una alta velocidad de subida.
# Boxplot de velocidad de descargar
alt.Chart(df).mark_boxplot(color='#fdb462').encode(
x=alt.X('speed_df1:Q', title='Velocidad de descarga (Mbps)'),
tooltip=['speed_df1:Q']
).properties(
title='Boxplot de velocidad de descarga'
)
Se observa que la mediana se ubica alrededor de los 55 Mbps, con mínimos y máximos entre 0 y 225 Mbps aproximadamente. Asimismo, el 50% de los datos se encuentran entre 25 y 105 Mbps aproximadamente. Por último, se visualizan gran cantidad de outliers, destacándose dos casos por encima de los 350 Mbps.
# Boxplot de velocidad de carga
alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
x=alt.X('speed_uf1:Q', title='Velocidad de carga (Mbps)'),
tooltip=['speed_uf1:Q']
).properties(
title='Boxplot de velocidad de carga'
)
Se comprueba que la velocidad de carga en todas sus medidas es menor a la de descarga. Se observa que la mediana se ubica alrededor de los 40 Mbps, con mínimos y máximos entre 0 y 180 Mbps aproximadamente. Asimismo, el 50% de los datos se encuentran entre 20 y 80 Mbps aproximadamente. Por último, se visualizan gran cantidad de outliers, destacándose tres casos por encima de los 270 Mbps.
#Creamos un tabla resumen de la velocidad mediana por país
df_mediana = df.groupby('COUNTRY')[['speed_df1', 'speed_uf1']].median().reset_index()
df_mediana = df_mediana.rename(columns={'speed_df1': 'Velocidad de descarga (Mbps)', 'speed_uf1': 'Velocidad de carga (Mbps)'})
df_mediana
| COUNTRY | Velocidad de descarga (Mbps) | Velocidad de carga (Mbps) | |
|---|---|---|---|
| 0 | Antigua and Barbuda | 28.398862 | 11.317931 |
| 1 | Argentina | 56.878448 | 31.845309 |
| 2 | Bahamas | 69.056249 | 17.747000 |
| 3 | Bolivia | 19.276464 | 12.128492 |
| 4 | Brazil | 102.745613 | 80.675300 |
| 5 | Chile | 228.860600 | 187.343333 |
| 6 | Colombia | 23.234396 | 16.489475 |
| 7 | Costa Rica | 68.336215 | 46.408289 |
| 8 | Cuba | 2.308000 | 1.256217 |
| 9 | Ecuador | 56.957475 | 56.445784 |
| 10 | El Salvador | 33.012580 | 9.460210 |
| 11 | Guatemala | 25.509683 | 9.931094 |
| 12 | Haiti | 38.515536 | 13.303209 |
| 13 | Honduras | 24.246500 | 14.746000 |
| 14 | Jamaica | 62.058600 | 43.066160 |
| 15 | Mexico | 29.598111 | 11.924144 |
| 16 | Nicaragua | 38.700523 | 16.868031 |
| 17 | Panama | 126.783778 | 48.058406 |
| 18 | Paraguay | 39.478333 | 25.349867 |
| 19 | Peru | 49.211497 | 33.341607 |
| 20 | República Dominicana | 24.214570 | 8.415603 |
| 21 | Saint Kitts and Nevis | 52.373773 | 35.167820 |
| 22 | Suriname | 16.304518 | 8.468032 |
| 23 | Trinidad and Tobago | 134.298791 | 96.694042 |
| 24 | Uruguay | 164.202952 | 37.172521 |
| 25 | Venezuela | 23.105571 | 17.234133 |
#Graficamos la velocidad mediana de descarga por país obtenida en la tabla anterior
df_sorted = df_mediana.sort_values(by='Velocidad de descarga (Mbps)')
bar=alt.Chart(df_sorted).mark_bar(color='#fdb462').encode(
x=alt.X('Velocidad de descarga (Mbps)',sort ='-x'),
y=alt.Y('COUNTRY', title='País'),
tooltip=[
alt.Tooltip('Velocidad de descarga (Mbps)', title='Velocidad de descarga (Mbps)', format='.0f')
]
).properties(
title="Velocidad de descarga mediana por país en 2023 (Mbps)" )
bar
Los países con las velocidades más altas son Uruguay y Chile, con medianas superiores a 150 Mbps, lo que refleja un acceso más desarrollado a conexiones de alta velocidad. En contraste, otros países como Cuba, Suriname, Colombia, Venezuela y Bolivia presentan velocidades considerablemente más bajas, por debajo de los 50 Mbps en promedio. Esto sugiere una disparidad significativa en la infraestructura de internet en la región, con algunos países logrando mejores resultados en la calidad de sus redes, mientras que otros se mantienen rezagados.
#Graficamos la velocidad mediana de carga por país obtenida en la tabla anterior
df_sorted = df_mediana.sort_values(by='Velocidad de carga (Mbps)')
bar=alt.Chart(df_sorted).mark_bar(color='#bc80bd').encode(
x=alt.X('Velocidad de carga (Mbps)',sort='-x'),
y=alt.Y('COUNTRY', title='País'),
tooltip=[
alt.Tooltip('Velocidad de carga (Mbps)', title='Velocidad de carga (Mbps)', format='.0f')
]
).properties(
title="Velocidad de carga mediana por país en 2023 (Mbps)" )
bar
El país con la velocidad de carga más alta por amplio margen es Chile, con medianas superiores a 180 Mbps. A diferencia del gráfico anterior, Uruguay retrocedió algunas posiciones, evidenciando una marcada diferencia entre sus velocidades promedio. En contraposición, nuevamente Cuba y Bolivia presentan las velocidades más bajas, como así también Suriname y Rep. Dominicana, encontrándose por debajo de los 20 Mbps en promedio. Nuevamente, esto expone una disparidad significativa en la infraestructura de internet en la región.
#Realizamos Box-plot para ambas velocidades, lo cual también nos permite visualizar máximos/mínimos/rangos intercuartílicos
box1= alt.Chart(df).mark_boxplot(color='#fdb462').encode(
x=alt.X('speed_df1:Q', title='Velocidad de descarga (Mbps)'),
y=alt.Y('COUNTRY:N', title = None),
tooltip=['speed_df1:Q']
)
box2= alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
x=alt.X('speed_uf1:Q', title='Velocidad de carga (Mbps)'),
y=alt.Y('COUNTRY:N', title = None),
tooltip=['speed_uf1:Q']
)
box= alt.hconcat(box1, box2).properties(
title=alt.TitleParams(
text='Comparación de Velocidades de Descarga y Carga por País',
anchor='middle',
fontSize=16
)
)
box
Si bien en el gráfico se expone a América Latina y el Caribe, si focalizamos el análisis en los países de Sudamérica, como se observó en los gráficos precedentes, Chile destaca significativamente con las velocidades más altas tanto en descarga como en carga, seguido por Brasil que muestra una dispersión considerable en ambas métricas con valores medianos también altos. En contraste, Bolivia, Venezuela y Colombia presentan las velocidades más bajas de la región, con medianas por debajo de los 50 Mbps en ambas métricas. Llama la atención en algunos casos la amplia variabilidad en las velocidades de carga y descarga, evidenciado en amplios rangos intercuartílicos, lo que sugiere disparidades importantes en la calidad de la conectividad por ejemplo en Perú, Chile, Brasil y Paraguay. De forma general, se aprecia una marcada heterogeneidad en el desempeño de las redes de internet entre los países de la región.
# Boxplot de % de hogares con acceso a internet
alt.Chart(df).mark_boxplot(color='#66c2a5').encode(
x=alt.X('tics_internet:Q', title='% de hogares con acceso a internet'),
tooltip=['tics_internet:Q']
).properties(
title='Boxplot de % de hogares con acceso a internet'
)
Se observa que la mediana se ubica alrededor del 12%, con mínimos y máximos entre 0% y 57% aproximadamente. Asimismo, el 50% de los datos se encuentran entre 5% y 25% aproximadamente.
# Boxplot de % de hogares con acceso a internet con apertura por país
alt.Chart(df).mark_boxplot(color='#66c2a5').encode(
x=alt.X('tics_internet:Q', title='% de hogares con acceso a internet'),
y=alt.Y('COUNTRY:N', title = None),
tooltip=['tics_internet:Q']
).properties(
title='Boxplot de % de hogares con acceso a internet por país'
)
El gráfico muestra una amplia variación en el porcentaje de hogares con acceso a internet entre los diferentes países. Se destaca el bajo nivel de acceso en Bolivia, El Salvador y Nicaragua, en contraposición de Jamaica, Panamá, Ecuador y Paraguay que poseen medianas mucho más elevadas. No obstante ello, estos últimos dos países poseen rangos intercuartílicos considerablemente amplios, lo cual evidencia una gran heterogeneidad en el acceso a internet según región. Por otra parte, Uruguay presenta gran homogeneidad en sus observaciones, ya que los datos se encuentran en un rango comprimido.
# Boxplot de población (nivel municipo)
alt.Chart(df).mark_boxplot(color='#8da0cb').encode(
x=alt.X('poblacion:Q', title='Población'),
tooltip=['poblacion:Q']
).properties(
title='Boxplot de población'
)
df['poblacion'].median()
13758.5
El gráfico no es fácil de apreciar dada su gran disparidad entre la población de los municipios, por eso se procedió a calcular la mediana, la cual se ubica en 13.758.
# Boxplot de población con apertura por país
alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
x=alt.X('poblacion:Q', title='Población'),
y=alt.Y('COUNTRY:N', title = None),
tooltip=[
alt.Tooltip('NAME_1', title='Estado/Provincia'),
alt.Tooltip('poblacion', title='Población', format=',.0f')
]
).properties(
title='Boxplot de población'
)
Existe una gran variabilidad para este campo, lo cual dificulta el resto del análisis y dónde se destacan como outliers los registros pertenecientes a las grandes urbes: Buenos Aires, San Pablo, Río de Janeiro, Bogotá y Lima.
¿Cuál es el país y ciudad con la mayor velocidad?
duckdb.sql("select COUNTRY as Country, NAME_1 as Estado, NAME_2 as Ciudad, speed_df1 as Velocidad from df order by speed_df1 desc limit 1").df()
| Country | Estado | Ciudad | Velocidad | |
|---|---|---|---|---|
| 0 | Brazil | Rio Grande do Sul | Itatiba do Sul | 482.627 |
¿Y dentro de Argentina?
duckdb.sql("select COUNTRY as Country, NAME_1 as Ciudad, speed_df1 as Velocidad from df where COUNTRY = 'Argentina' order by speed_df1 desc limit 1").df()
| Country | Ciudad | Velocidad | |
|---|---|---|---|
| 0 | Argentina | Ciudad de Buenos Aires | 150.602219 |
¿Cuál es el país y ciudad con la menor velocidad?
duckdb.sql("select COUNTRY as Country, NAME_1 as Estado, NAME_2 as Ciudad, speed_df1 as Velocidad from df order by speed_df1 asc limit 1").df()
| Country | Estado | Ciudad | Velocidad | |
|---|---|---|---|---|
| 0 | Brazil | Rio Grande do Sul | São José das Missões | 0.157 |
En Argentina ...
duckdb.sql("select COUNTRY as Country, NAME_1 as Provincia, speed_df1 as Velocidad from df where COUNTRY = 'Argentina' order by speed_df1 asc limit 1").df()
| Country | Provincia | Velocidad | |
|---|---|---|---|
| 0 | Argentina | Tierra del Fuego | 18.084988 |
Dentro de Argentina, ¿cuáles son las provincias con una velocidad mayor al promedio del país?
query = duckdb.sql("""
with m as (
select COUNTRY as country, avg(speed_df1) AS avg_velocidad_descarga
from df
group by COUNTRY)
select df.COUNTRY as country, NAME_1 as estado, NAME_2 as ciudad, speed_df1, avg_velocidad_descarga
from df inner join m on df.COUNTRY = m.country
where speed_df1 > avg_velocidad_descarga and df.COUNTRY = 'Argentina'
""").df()
alt.Chart(query).mark_bar().encode(
y=alt.Y('estado:N', title= None, sort='-x'),
x=alt.X('speed_df1:Q', title='Velocidades de descarga'),
color=alt.Color('estado:N', title = '',
scale=alt.Scale(range=palette), legend=None),
tooltip=[
alt.Tooltip('country:N', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('avg_velocidad_descarga', title='Prom. Velocidad Descarga', format=',.0f')
]
).properties(
title='Provincias argentinas con velocidades promedio por encima del promedio del país'
)
Entre las provincias argentinas que se destacan por tener una velocidad de descarga por encima del promedio (59 Mpbs) se encuentra la Ciudad Autónoma de Buenos Aires con 151 Mbps, seguida de la Prov. de Buenos Aires (103Mbps), Tucumán (81 Mbps), Santa Fe (72 Mbps) y Córdoba (69 Mbps).
Y, ¿cuáles son las provincias con una velocidad menor al promedio del país?
query = duckdb.sql("""
with m as (
select COUNTRY as country, avg(speed_df1) AS avg_velocidad_descarga
from df
group by COUNTRY)
select df.COUNTRY as country, NAME_1 as estado, NAME_2 as ciudad, speed_df1, avg_velocidad_descarga
from df inner join m on df.COUNTRY = m.country
where speed_df1 < avg_velocidad_descarga and df.COUNTRY = 'Argentina'
""").df()
alt.Chart(query).mark_bar().encode(
y=alt.Y('estado:N', title= None, sort='-x'),
x=alt.X('speed_df1:Q', title='Velocidades de descarga'),
color=alt.Color('estado:N', title = '',
scale=alt.Scale(range=palette), legend=None),
tooltip=[
alt.Tooltip('country:N', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('avg_velocidad_descarga', title='Prom. Velocidad Descarga', format=',.0f')
]
).properties(
title='Provincias argentinas con velocidades promedio por debajo del promedio del país'
)
Entre las provincias argentinas que se destacan por tener una velocidad de descarga por debajo del promedio (59 Mpbs) se encuentra Tierra del Fuego con 18 Mbps, seguida de La Pampa (23 Mbps), San Luis (25 Mbps) y Santa Cruz (32 Mbps).
#Gráfico de dispersión para observar la relación entre las variables de velocidad de subida y descarga
alt.Chart(df).mark_circle().encode(
alt.X('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=False),
alt.Y('speed_uf1',title='Velocidad de carga (Mbps)').scale(zero=False, padding=1),
color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
tooltip=[
alt.Tooltip('COUNTRY', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('speed_uf1', title='Velocidad de carga (Mbps)', format='.0f')
]
).properties(
title=alt.TitleParams(
text='Relación entre velocidad de carga y descarga por país',
anchor='middle',
fontSize=16
),
width=500,
height=300
)
Se observa una relación general positiva, donde mayores velocidades de descarga se asocian con mayores velocidades de carga. Sin embargo, esta relación no es perfectamente lineal, ya que existen varios casos donde países con velocidades de descarga similares muestran diferencias significativas en sus velocidades de carga.
#Aplicamos logaritmo a la variable población a efectos de suavizar las diferencias y facilitar la interpretación
df['total_population_ctry'] = df.groupby('COUNTRY')['poblacion'].transform('sum')
df['pob_per']=round((df['poblacion']/df['total_population_ctry'])*100, ndigits=2)
df.head()
df['log_pob']=round(np.log(df['poblacion']), ndigits=2)
df.head()
| COUNTRY | NAME_1 | NAME_2 | speed_df1 | speed_uf1 | poblacion | tics_internet | agua_mejorada_red | electricidad | total_population_ctry | pob_per | log_pob | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Argentina | Buenos Aires | NaN | 103.450934 | 54.207011 | 15634050.0 | NaN | 0.756510 | 0.997917 | 40134498.0 | 38.95 | 16.56 |
| 1 | Argentina | Catamarca | NaN | 58.539385 | 31.985785 | 367556.0 | NaN | 0.935111 | 0.976998 | 40134498.0 | 0.92 | 12.81 |
| 2 | Argentina | Chaco | NaN | 52.419413 | 27.133152 | 1055337.0 | NaN | 0.763009 | 0.939295 | 40134498.0 | 2.63 | 13.87 |
| 3 | Argentina | Chubut | NaN | 51.833834 | 44.693544 | 509194.0 | NaN | 0.963976 | 0.990512 | 40134498.0 | 1.27 | 13.14 |
| 4 | Argentina | Ciudad de Buenos Aires | NaN | 150.602219 | 59.033449 | 2892544.0 | NaN | 0.997258 | 0.999503 | 40134498.0 | 7.21 | 14.88 |
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y la población del país
alt.Chart(df).mark_circle().encode(
alt.X('log_pob', title='Población (log)').scale(zero=False),
alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
tooltip=[
alt.Tooltip('COUNTRY', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('total_population_ctry', title='Población', format=',.0f')
]
).properties(
title=alt.TitleParams(
text='Relación entre velocidad de decarga y población por país',
anchor='middle',
fontSize=16
),
width=500,
height=300
)
El gráfico muestra una relación positiva entre la velocidad de descarga y el tamaño de la población en los gobiernos subnacionales (proxy de ruralidad), aunque no es una correlación perfectamente lineal. Los subnacionales con poblaciones más grandes tienden a tener velocidades de descarga más altas, pero hay excepciones, lo que indica que otros factores más allá del tamaño de la población influyen en el rendimiento de Internet. Los puntos de datos exhiben una dispersión considerable, lo que sugiere una variabilidad significativa en las velocidades de descarga incluso entre subnacionales con niveles de población similares. Esta heterogeneidad implica que factores como las inversiones en infraestructura, la topografía o las políticas pueden desempeñar un papel importante en la configuración del acceso y la calidad de Internet en la región.
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y la penetración de internet en los hogares
alt.Chart(df).mark_circle().encode(
alt.X('tics_internet', title='% Hogares con acceso a internet').scale(zero=False),
alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=False, padding=1),
color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
#size='poblacion',
tooltip=[
alt.Tooltip('COUNTRY', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('tics_internet', title='% Hogares con acceso', format='.0%')
]
).properties(
title=alt.TitleParams(
text='Relación entre velocidad de decarga y % de hogares con acceso a internet',
anchor='middle',
fontSize=16
),
width=500,
height=360
)
Se observa una relación positiva, donde los subnacionales con mayor porcentaje de hogares conectados tienden a tener velocidades de descarga más altas. Sin embargo, también hay bastante variabilidad. La dispersión de los puntos también indican una gran heterogeneidad dentro de algunos países, con amplias brechas en la velocidad de acceso a internet entre diferentes regiones del país. Se visualizan casos atípicos correspondientes a Brasil con un % de acceso menor al 10% y con velocidades superiores a 300Mbps, para los cuales habría que corroborar si se corresponden con errores o no.
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y el acceso a electricidad
alt.Chart(df).mark_circle().encode(
alt.X('electricidad', title='% Hogares con acceso a electricidad').scale(zero=False),
alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
tooltip=[
alt.Tooltip('COUNTRY', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('electricidad', title='% Hogares con acceso', format='.0%')
]
).properties(
title=alt.TitleParams(
text='Relación entre velocidad de decarga y % de hogares con acceso a electricidad',
anchor='middle',
fontSize=16
),
width=500,
height=360
)
La relación no es completamente lineal y positiva. Hay una tendencia general de aumento en la velocidad de descarga a medida que aumenta el acceso a electricidad, pero también se observan notables excepciones donde subnacionales con alto acceso eléctrico tienen velocidades relativamente bajas. Esto sugiere que otros factores, más allá del simple acceso a la red eléctrica, también influyen en la velocidad final de descarga, como la calidad de la infraestructura de telecomunicaciones u otros aspectos económicos y tecnológicos.
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y el abastecimiento de agua a través de red
alt.Chart(df).mark_circle().encode(
alt.X('agua_mejorada_red', title='% Hogares con agua por red').scale(zero=False),
alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
tooltip=[
alt.Tooltip('COUNTRY', title='País'),
alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
alt.Tooltip('electricidad', title='% Hogares con agua por red', format='.0%')
]
).properties(
title=alt.TitleParams(
text='Relación entre velocidad de decarga y % Hogares con agua por red',
anchor='middle',
fontSize=16
),
width=500,
height=360
)
La relación entre la velocidad de descarga y el porcentaje de hogares con acceso a agua por red también muestra una tendencia general positiva, pero con considerables excepciones. Algunos subnacionales con alto acceso a agua tienen velocidades de descarga relativamente bajas, mientras que otros con menor acceso tienen velocidades más altas.
!jupyter nbconvert --to html TP_final_vF.ipynb
[NbConvertApp] Converting notebook TP_final_vF.ipynb to html [NbConvertApp] Writing 6793555 bytes to TP_final_vF.html
import os
os.listdir()
['.config', '.ipynb_checkpoints', 'TP_final_vF.ipynb', 'TP_final_vF.html', 'sample_data']
from google.colab import files
files.download('TP_final_vF.html')